<?php
/**
 * 示例函数
 * @param string $str 字符串
 * @return string $str
 */
function demo($str='Hello')
{
    return $str;
} 
/**
 * 判断截取范围类型
 * @param string $scope
 * @return string
 */
function checkScopeType($scope){
    if (strstr($scope,'[')) {
        // 节
        return 'verse';
    } elseif (strstr($scope,':')) {
        // 章
        return 'chapter';
    } else {
        // 卷
        return 'volume';
    }
} 
  
/**
 * 正则匹配中内层中括号里的内容
 * @param array $arr
 * @return array $arr
 */
function getInner($str)
{
    if (strstr($str, '[') && strstr($str, ']')) {
        $strSubject = str_replace(['[',']'],['【','】'],$str);
        $strPattern = "/(?<=【)[^】]+/";
        $arr = [];
        preg_match_all($strPattern, $strSubject, $arr);
        return $arr[0];
    } else {
        return [$str];
    }
}  
/**
 * 填充数字范围
 * @param array $arr
 * @return array
 */
function fill_number($arr){
    if (count($arr) == 1 || count($arr) == 0) return $arr;
    $number_arr = [];
    for ($i = min($arr); $i <= max($arr); $i++) {        array_push($number_arr, (int) $i);
    }
    return $number_arr;
} 
  
/**
 * 正则匹配中最外层中括号里的内容
 * @param string $str
 * @return string $str
 */
function getOutermost($str)
{
    $result = array();
    preg_match_all("/(?:\[)(.*)(?:\])/i",$str, $result);
    return $result[1][0];
} 
  
/**
 * 获取某个字符在字符串中的所有位置
 * @param string $scope
 */
function getCharpos($str, $char){
    $j = 0;
    $arr = array();
    $count = mb_substr_count($str, $char);
    for($i = 0; $i < $count; $i++){
        $j = mb_strpos($str, $char, $j);
        $arr[] = $j;
        $j = $j+1;
    }
    return $arr;
} 
  
/**
 * 返回取汉字的第一个字的首字母
 * @param string $str 字符
 * @return string
 */
function getFirstLetter($str){
    if(empty($str)){return '';}
    $fchar=ord($str[0]);
    if($fchar>=ord('A')&&$fchar<=ord('z')) return strtoupper($str[0]);
    try{
        $s1=iconv('UTF-8','gb2312',$str);
        $s2=iconv('gb2312','UTF-8',$s1);
    }catch (\Exception $e){
        $s1=iconv('UTF-8','GBK',$str);
        $s2=iconv('GBK','UTF-8',$s1);
    }
    $s=$s2==$str?$s1:$str;
    $asc=ord($s[0])*256+ord($s[1])-65536;
    if($asc>=-20319&&$asc<=-20284) return 'A';
    if($asc>=-20283&&$asc<=-19776) return 'B';
    if($asc>=-19775&&$asc<=-19219) return 'C';
    if($asc>=-19218&&$asc<=-18711) return 'D';
    if($asc>=-18710&&$asc<=-18527) return 'E';
    if($asc>=-18526&&$asc<=-18240) return 'F';
    if($asc>=-18239&&$asc<=-17923) return 'G';
    if($asc>=-17922&&$asc<=-17418) return 'H';
    if($asc>=-17417&&$asc<=-16475) return 'J';
    if($asc>=-16474&&$asc<=-16213) return 'K';
    if($asc>=-16212&&$asc<=-15641) return 'L';
    if($asc>=-15640&&$asc<=-15166) return 'M';
    if($asc>=-15165&&$asc<=-14923) return 'N';
    if($asc>=-14922&&$asc<=-14915) return 'O';
    if($asc>=-14914&&$asc<=-14631) return 'P';
    if($asc>=-14630&&$asc<=-14150) return 'Q';
    if($asc>=-14149&&$asc<=-14091) return 'R';
    if($asc>=-14090&&$asc<=-13319) return 'S';
    if($asc>=-13318&&$asc<=-12839) return 'T';
    if($asc>=-12838&&$asc<=-12557) return 'W';
    if($asc>=-12556&&$asc<=-11848) return 'X';
    if($asc>=-11847&&$asc<=-11056) return 'Y';
    if($asc>=-11055&&$asc<=-10247) return 'Z';
    return 'Z';
} 
  
/**
* 获取mp3长度
* @param string $url
* @return $duration
*/
function getMp3Duration($url) {
    include_once app_path('Home/Utils/GetID3/getid3.php');
    $duration = 0;
    $getid3 = new \getid3();     $filename = time().'.mp3';    $getFileRe = getFile($url, storage_path(), $filename);
    if (isset($getFileRe['save_path'])) {
        //分析文件，音频文件的地址（文件绝对路径）
        $ThisFileInfo = @$getid3->analyze($getFileRe['save_path']);        $duration = $ThisFileInfo['playtime_seconds']*1000;
        unlink($getFileRe['save_path']);
    }
    return $duration;
}  
/**
 * 二维数组按字母A-Z排序
 * @param array $arr 传入数组
 * @param string $key 需要排序的键值
 * @param int $order/$type 查看
 */
function letterSort($arr, $key){
    foreach ($arr as $k => $v) {
        $name = preg_replace('/^\d+/','',$v[$key]);
        $arr[$k]['letter'] = getFirstLetter($name);
    }
    $data = array();
    foreach ($arr as $v) {
        if (empty($data[$v['letter']])) {
            $data[$v['letter']] = array();
        }
        $data[$v['letter']][]=$v;           }
    ksort($data);
    return $data;
} 
/**
 * 解析章ID
 * @param string $str
 * @return string $str
 */
function parseChapterId($str){
    if (strstr($str, '[') && strstr($str, ':')) {
        return cut(':','[',$str);
    } elseif (strstr($str, '[') && !strstr($str, ':')) {
        return substr($str,0,strrpos($str,'['));
    } elseif (!strstr($str, '[') && strstr($str, ':')) {
        return substr($str,strrpos($str,':')+1);
    } else {
        return $str;
    }
} 
  
/**
 * 截取指定两个字符之间的字符串
 * @param string $begin 开始字符
 * @param string $end 结束字符
 * @param string $str 字符串
 * @return string
 */
function cut($begin,$end,$str){
    $b = mb_strpos($str,$begin) + mb_strlen($begin);
    $e = mb_strpos($str,$end) - $b;
    return mb_substr($str,$b,$e);
}

/**
 * 解析范围
 * @param string $scope
 * @return array $multiScopes
 */
function parseScope($scope){
    $multiScopes['verse'] = [];
    $multiScopes['chapter'] = [];
    $multiScopes['volume'] = [];
    $scopes = explode(';',$scope);
    foreach ($scopes as $key => $value) {
        // 判断分割后的字符串是否包含中文
        if (mb_strlen($value) == strlen($value) && isset($scopes[$key-1])) {
            $scopes[$key-1] .= ';'.$value;
            unset($scopes[$key]);
        }
    }    $scopes = array_values($scopes);
    foreach ($scopes as $key => $value) {
        $scopeType = checkScopeType($value);
        array_push($multiScopes[$scopeType], $value);
    }
    return array_filter($multiScopes);
} 
 
/**
 * 关联数组中取出某一列KEY的值并放入另一个数组中
 * @param array $array
 * @param array $key
 * @return array
 */
function array_pluck($array, $key)
{
    $values = array();
    foreach ($array as $k=>$v)
    {
        if (isset($v[$key]))
        {
            // Found a value in this row
            $values[$k][$key] = $v[$key];
        }
    }
    return $values;
} 
  
/**
 * 获取分页信息
 * @param int $nowPage 当前页
 * @param int $totalRows 总条数
 * @param int $listRows 每页显示条数，默认为10
 * @return array $aPage
 */
function getPage($nowPage, $totalRows, $listRows=10){
    $totalPages = ceil($totalRows / $listRows);
    $firstRow = ($nowPage-1) * $listRows;
    $firstRow = $firstRow<0 ? 0 : $firstRow;
    // 起始条数
    $aPage['firstRow'] = $firstRow;
    // 每页显示条数
    $aPage['listRows'] = $listRows;
    // 当前页
    $aPage['nowPage'] = $nowPage;
    // 总条数
    $aPage['totalRows'] = $totalRows;
    // 总页数
    $aPage['totalPages'] = $totalPages;
    return $aPage;
}